class_name PropertyData
extends Resource

# PropertyData计算方式
enum PropertyDataCalcType
{
	Max, # 取最大值
	Min, # 取最小值
	Add, # 逐个相加后加原值
	Mul, # 逐个相乘后乘原值
	OneAdd, # 跟1逐个相加后乘原值
	InOneAdd, # 原值除以跟1逐个相加后的值
}

# 原始值计算类型
@export var calc_type:PropertyDataCalcType
# 百分比值计算类型
@export var percent_calc_type:PropertyDataCalcType
@export var property_modifiers:Array[PropertyModifier]
# 对于最终值的获取前最后一次修饰（常用于对获取结果的范围限制）
var property_value_last_modified_func:Callable
signal property_data_changed(last_modified_value,new_modified_value)

# 抽象方法，子类必须实现
func get_property():
	return property_value_last_modified_func.call(0) if property_value_last_modified_func else 0
# 抽象方法，子类必须实现
func get_modified_property():
	return property_value_last_modified_func.call(0) if property_value_last_modified_func else 0
# 检查能否改变property
func check_can_change_property(change_value) -> bool:
	return true
# 抽象方法，子类必须实现
func change_property(change_value):
	pass
## 获取同Tag的Modifier列表
func get_same_tag_modifiers(tag:String) -> Array[PropertyModifier]:
	var modifiers:Array[PropertyModifier] = property_modifiers.filter(func(x):return x.tag == tag)
	return modifiers
## 添加Modifier
func add_modifier(tag:String,value,is_percent:bool = false) -> int:
	var last_modified_value = get_modified_property()
	var new_modifier:PropertyModifier = PropertyModifier.new()
	new_modifier.init(tag,value,is_percent)
	property_modifiers.append(new_modifier)
	property_data_changed.emit(last_modified_value,get_modified_property())
	return new_modifier.id
## 移除指定Id的修改器
func remove_modifier_by_id(modifier_id:int):
	var last_modified_value = get_modified_property()
	var modifiers:Array[PropertyModifier] = property_modifiers.filter(func(x):return x.id == modifier_id)
	for modifier:PropertyModifier in modifiers:
		property_modifiers.erase(modifier)
	property_data_changed.emit(last_modified_value,get_modified_property())
## 移除指定Tag的修改器
func remove_modifier_by_tag(tag:String):
	var last_modified_value = get_modified_property()
	var modifiers:Array[PropertyModifier] = get_same_tag_modifiers(tag)
	for modifier:PropertyModifier in modifiers:
		property_modifiers.erase(modifier)
	property_data_changed.emit(last_modified_value,get_modified_property())
